package cn.xuguowen.user.designPatten.strategy.prod;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ClassName: PayFactory
 * Package: cn.xuguowen.user.designPatten.strategy.prod
 * Description: 具体支付策略类的工厂
 * 交给IOC容器管理!InitializingBean作为一个知识点进行学习！
 * @Author 徐国文
 * @Create 2023/4/28 18:49
 * @Version 1.0
 */
@Component
public class PayFactory implements InitializingBean {

    // 初始化当前bean实例对象的时候，会将IOC容器中所有的PayHandler对象注入到payHandlerList属性中
    @Resource
    private List<PayHandler> payHandlerList;

    // 存储所有的支付策略实现类对象。key是支付枚举类型，value是具体的支付策略实现类对象
    private Map<PayChannelEnum,PayHandler> payHandlerMap = new HashMap<>();

    /**
     * 从map集合中获取指定的支付策略实现类对象
     * @param code
     * @return
     */
    public PayHandler getPayHandlerByCode(Integer code) {
        // 先根据code获取指定的支付策略枚举类对象
        PayChannelEnum channelEnum = PayChannelEnum.getByCode(code);
        // 然后将其作为key从map集合中获取对于的value（具体的支付策略实现类对象）
        return payHandlerMap.get(channelEnum);
    }


    // 将所有的支付策略实现类放入到Map集合中
    @Override
    public void afterPropertiesSet() throws Exception {
        for (PayHandler payHandler : payHandlerList) {
            payHandlerMap.put(payHandler.getPayChannel(),payHandler);
        }
    }
}
